const fp = require('lodash/fp');
const { Maybe, Contaniner } = require('./support');

let maybe = Maybe.of([5, 6, 1]);

/**
 * 使用 fp.add(x, y)和 fp.map(f, x)创建一个能让 functor 里的值增加的函数 ex1
 * @param {*} number
 * @return {Function}
 */
let ex1 = number => {
  return arr => {
    return fp.map(x => fp.add(x, number), arr);
  };
};

const r1 = maybe.map(ex1(2));

console.log(r1);

/**
 * 实现一个函数ex2，能够使用fp.first获取列表的第一个元素
 */
let xs = Contaniner.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do']);

let ex2 = arr => {
  return fp.first(arr);
};

const r2 = xs.map(ex2);

console.log(r2);

/**
 * 实现一个ex3，使用safeProp和fp.first找到user的名字的首字母
 */
let safeProp = fp.curry(function(x, o) {
  return Maybe.of(o[x]);
});

let user = { id: 2, name: 'Albert' };

let ex3 = fp.curry((fn, obj) => {
  return fn('name', obj).map(fp.first);
});

const r3 = ex3(safeProp)(user);

console.log(r3);

/**
 * 使用Maybe重写ex4，不要有if语句
 */
// let ex4 = function(n) {
//   if (n) { return parseInt(n) }
// }

let ex4 = n => Maybe.of(n).map(parseInt);

const r4 = ex4(3.13);

console.log(r4);
